
(* 
**********************************************************

	        COSY_PAK package chap1.m		

**********************************************************
*)

If [ TrueQ[ $VersionNumber >= 2.0 ],
     Off[ General::spell ];
     Off[ General::spell1 ] ]
     
(*  B E G I N     P A C K A G E  *)
     
BeginPackage["COSYPAK`chap1`","Algebra`ReIm`",
		"SignalProcessing`Support`SigProc`", 
		"SignalProcessing`Analog`LaPlace`",
		"SignalProcessing`Analog`InvLaPlace`",
		"SignalProcessing`Analog`LSolve`"];

ChekAnal::usage = 
"ChekAnal[Transf, s, r, w,showder]:  Checks the analyticity of the transfer function Transf(s) at the point s=r+jw using Cauchy-Reimann conditions.  If `showder=1' (optional) then the derivatives in the computation are shown. ";

PoleZeros::usage = 
"PoleZeros[Transf, s]: Computes finite  poles and zeros of the transfer function Transf . Returns {list of poles, list of zeros}.
";

Begin["`Private`"];

(* Function to check the analyticity of the transfer function *)

ChekAnal[Transf_,s_, r_,w_]:= ChekAnal[Transf,s, r,w,n] ;

ChekAnal[Transf_,s_, r_,w_,showdrv_]:=
Block[{g,greal,gimag,sol,dGrealr,dGrealw,dGimagr,dGimagw,poles},
	r/:Im[r]=0; w/:Im[w]=0; 
	g = ExpandAll[Transf/.s->(r + w I)];
	greal = Simplify[Re[g]]; gimag = Simplify[Im[g]];
	Print[" G(r + w I) = ", greal + I gimag ];
	
	dGrealr = D[greal,r];	(* derive real part of G(r + w I) *) 
	dGrealw = D[greal,w];	
	
	dGimagr = D[gimag,r];	(* derive imaginary part of G(r + w I) *)
	dGimagw = D[gimag,w];
	
	(* Show the derivatives *)
	If[ showdrv==1,
	   Print["The derivatives:"]; 
	   Print["d Re[G(r + w I)] /dr = ",Together[dGrealr] ];	
	   Print["d Re[G(r + w I)] /dw = ",Together[dGrealw] ];
	   Print["d Im[G(r + w I)] /dr = ",Together[dGimagr] ];
	   Print["d Im[G(r + w I)] /dw = ",Together[dGimagw] ] 
	   ];	
	
	(* dGx/dsigma - dGy/domega *)
	If[ (Simplify[dGrealr-dGimagw] ==0) &&
	    (Simplify[dGrealw+dGimagr] ==0),

	  poles = Solve[ Denominator[Simplify[Transf]] ==0, s];  
	  Print["    "];  
	  Print["The Transfer function G(s)= ", Transf," IS an analytical",
	     " function except at the singulality points: ", s/.poles],
	  Print["The Transfer function G(s)= ", Transf," IS NOT an analytical",
	     " function."]
	   ];
	  ];
	  
(* Function list the zeros and poles of the transfer function *)
PoleZeros[Transf_,s_]:=
Block[{gg,gden,gnum},
	gg = Simplify[Transf];
	gden = Denominator[gg] ;
	gnum = Numerator[gg];
	poles = N[Solve[gden ==0, s]]; 
	zeros = N[Solve[gnum ==0, s]];
	Print["The transfer function G(s)= ", Transf];     
	Print["    " ];
	Print["The Poles of G(s) is:",s/.poles];
	Print["    " ];
	Print["The Zeros of G(s) is:",s/.zeros];
	Return[{s/.poles,s/.zeros}]
	];	
End[]
EndPackage[];

(*  E N D     P A C K A G E  *)

If [ TrueQ[ $VersionNumber >= 2.0 ],
     On[ General::spell ];
     On[ General::spell1 ] ]
